﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Serialization;
using System.IO;

namespace TCPSockets.ClientEvents.Args
{
    /// <summary>
    /// Параметры передачи данных
    /// </summary>
    /// <remarks>Содержит данные в виде массива символов.</remarks>
    public class DataEventArgs : EventArgs
    {
        /// <summary>
        /// Данные в виде массива символов
        /// </summary>
        public readonly byte[] Data;
        public readonly Encoding DataEncoding;

        protected IFormatter DataFormatter;

        /// <summary>
        /// Свойство, возращающее массив строк, генерируемый разделением 
        /// исходных данны, используя в качестве разделителя символ конца строки
        /// </summary>
        public string Message { get { return DataEncoding.GetString(Data); } }
        public object Object { get { return Deserialize(); } }

        /// <summary>
        /// Конструктор из символьного массива
        /// </summary>
        /// <param name="Data">Данные</param>
        public DataEventArgs(byte[] Data, Encoding DataEncoding, IFormatter DataFormatter)
        {
            this.Data = Data;
            this.DataEncoding = DataEncoding;
            this.DataFormatter = DataFormatter;
        }

        protected object Deserialize()
        {
            using( MemoryStream mStream = new MemoryStream(Data) )
                return DataFormatter.Deserialize(mStream);
        }

        /// <summary>
        /// Перекрытый метод, возращающий данные в виде строки.
        /// Используется, как стандарт программирования для перевода 
        /// любого объекта в строковое отображение
        /// </summary>
        public override string ToString()
        {
            return Message;
        }
    }
}
